      * cobc -x procesar.cbl -o procesar.exe prueba para commit
      ******************************************************************
       IDENTIFICATION DIVISION.
      ******************************************************************
       PROGRAM-ID. procesar.       

      ******************************************************************
       ENVIRONMENT DIVISION.
	   CONFIGURATION SECTION.
	     SPECIAL-NAMES.
         DECIMAL-POINT IS COMMA. 
      ******************************************************************
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
        SELECT ArchivoReservas1 ASSIGN TO "RES1.DAT"
        ORGANIZATION IS LINE SEQUENTIAL
        FILE STATUS IS FSReservas1.
        SELECT ArchivoReservas2 ASSIGN TO "RES2.DAT"
        ORGANIZATION IS LINE SEQUENTIAL
        FILE STATUS IS FSReservas2.
        SELECT ArchivoReservas3 ASSIGN TO "RES3.DAT"
        ORGANIZATION IS LINE SEQUENTIAL
        FILE STATUS IS FSReservas3.
        SELECT ArchivoEstadias ASSIGN TO "ESTADIAS.DAT"
        ORGANIZATION IS LINE SEQUENTIAL
        FILE STATUS IS FSEstadias.
        SELECT ArchivoCategorias ASSIGN TO "CATEGORIAS.DAT"
        ORGANIZATION IS LINE SEQUENTIAL
        FILE STATUS IS FSCategorias.
        SELECT ArchivoMaestro ASSIGN TO "MAESTRO.DAT"
        ORGANIZATION IS LINE SEQUENTIAL
        FILE STATUS IS FSMaestro.
        SELECT ArchivoReporte ASSIGN TO "REPORTE.DAT"
        ORGANIZATION IS LINE SEQUENTIAL
        FILE STATUS IS FSReporte. 
      ******************************************************************
       DATA DIVISION.
      ******************************************************************
      *****************************************************
       FILE SECTION.
      *****************************************************
       FD ArchivoReservas1.
       01 RegistroReservas1.

          03 RES1-COD-RES PIC 9(6).
           03 RES1-RECURSO.
              05 FECHA-DES PIC X(10).
              05 FECHA-HAS PIC X(10).
              05 CATEG-HAB PIC 9(4).
           03 RES1-PERSONA.
              05 NOMBRE-CLI PIC X(30).
              05 TEL PIC X(15).
              05 DIR PIC X(30).
           03 RES1-IMP-RES PIC S9(6)V99.

      *********************************
        FD ArchivoReservas2.
        01 RegistroReservas2.
           03 RES2-COD-RES PIC 9(6).
           03 RES2-RECURSO.
              05 FECHA-DES PIC X(10).
              05 FECHA-HAS PIC X(10).
              05 CATEG-HAB PIC 9(4).
           03 RES2-PERSONA.
              05 NOMBRE-CLI PIC X(30).
              05 TEL PIC X(15).
              05 DIR PIC X(30).
           03 RES2-IMP-RES PIC S9(6)V99.

      *********************************
        FD ArchivoReservas3.
        01 RegistroReservas3.
           03 RES3-COD-RES PIC 9(6).
           03 RES3-RECURSO.
              05 FECHA-DES PIC X(10).
              05 FECHA-HAS PIC X(10).
              05 CATEG-HAB PIC 9(4).
           03 RES3-PERSONA.
              05 NOMBRE-CLI PIC X(30).
              05 TEL PIC X(15).
              05 DIR PIC X(30).
           03 RES3-IMP-RES PIC S9(6)V99.

      *********************************
        FD ArchivoEstadias.
        01 RegistroEstadias.
           03 EST-COD-RES PIC 9(6).
           03 EST-RECURSO.
              05 FECHA-DES PIC X(10).
              05 FECHA-HAS PIC X(10).
              05 CATEG-HAB PIC 9(4).
           03 EST-IMPORTE PIC S9(6)V99.

      *********************************
        FD ArchivoCategorias.
        01 RegistroCategorias.
           03 CAT-CATEG-HB PIC 9(4).
           03 CAT-DESCRIP PIC X(15).

      *********************************
        FD ArchivoMaestro.
        01 RegistroMaestro.
           03 MAE-COD-RES PIC 9(6).
           03 MAE-RECURSO.
              05 FECHA-DES PIC X(10).
              05 FECHA-HAS PIC X(10).
              05 CATEG-HAB PIC 9(4).
           03 MAE-PERSONA.
              05 NOMBRE-CLI PIC X(30).
              05 TEL PIC X(15).
              05 DIR PIC X(30).
           03 MAE-IMPORTE PIC S9(06)V99.
           03 MAE-ESTADO PIC X(1).

      *********************************
        FD ArchivoReporte.
        01 RegistroReporte.
           03 LINEA-REPORTE PIC X(476).


        WORKING-STORAGE SECTION.
      *****************************************************
        01 EofReservas1 PIC X.
          88 FIN VALUE 'S'.
          88 NO-FIN VALUE 'N'.
        01 FSReservas1 PIC 99.

        01 EofReservas2 PIC X.
          88 FIN VALUE 'S'.
          88 NO-FIN VALUE 'N'.
        01 FSReservas2 PIC 99.

        01 EofReservas3 PIC X.
           88 FIN VALUE 'S'.
           88 NO-FIN VALUE 'N'.
        01 FSReservas3 PIC 99.

        01 EofEstadias PIC X.
           88 FIN VALUE 'S'.
           88 NO-FIN VALUE 'N'.
        01 FSEstadias PIC 99.

        01 EofCategorias PIC X.
           88 FIN VALUE 'S'.
           88 NO-FIN VALUE 'N'.
        01 FSCategorias PIC 99.

        01 FSMaestro PIC 99.

        01 FSReporte PIC 99.

      *********************************
       01 RegistroPersona.
          03 NOMBRE-CLI PIC X(30).
          03 TEL PIC X(15).
          03 DIR PIC X(30).
       01 RegistroRecurso.
          03 FECHA-DES PIC X(10).
          03 FECHA-HAS PIC X(10).
          03 CATEG-HAB PIC 9(4).
       77 CodigoReserva PIC 9(6).
       77 Importe PIC S9(6)V99.
       77 Categoria PIC 9(4) VALUE 1.
       77 Descripcion PIC X(15).

       77 Menor PIC 9(6).

      *********************************
       01 LineaError.
          03 FILLER PIC X(7) VALUE "ERROR: ".
          03 MensajeError PIC X(70).
          
       01 LineaDebug.
          03 FILLER PIC X(9) VALUE ">>DEBUG: ".
          03 MensajeDebug PIC X(200).
       01 MostrarDebug PIC X(1) VALUE 'S'.

      *********************************
       77 TotalReservas PIC S9(6)V99 VALUE 0.
       77 CantidadReservas PIC 9(4) VALUE 0.
       77 CantidadLineas PIC 9(2) VALUE 0.

       77 LineasPorPagina PIC 9(3) VALUE 4.
       01 Fecha.
          03 Anio PIC 9(2).
          03 Mes PIC 9(2).
          03 Dia PIC 9(2).

      *********************************
       01  TablaCategorias.
         03  RegistroTablaCategoria occurs 50 times.
           05 CAT-CATEG-HB PIC 9(4).
           05 CAT-DESCRIP PIC X(15).

       77 IndiceCategoria PIC 9(2).
       77 ContadorCategoria PIC 9(2).
       77 CategoriaBuscada PIC 9(4).

      *********************************
       01 ReporteSalida.
         03 Encabezado.
           05 FILLER PIC X(7) VALUE "Fecha: ".
           05 FechaReporte.
             07 FILLER PIC X(2) VALUE "20".
             07 Anio PIC 9(2).
             07 FILLER PIC X(1) VALUE "/".
             07 Mes PIC 9(2).
             07 FILLER PIC X(1) VALUE "/".
             07 Dia PIC 9(2).

           05 FILLER PIC X(74) VALUE spaces.
           05 FILLER PIC X(9) VALUE "Hoja nro ".
           05 HojaNumero PIC 9(2) VALUE 1.
         03 Titulo.
           05 FILLER PIC X(41) VALUE spaces.
           05 FILLER PIC X(19) VALUE "LISTADO DE ESTADIAS".
           05 FILLER PIC X(42) VALUE spaces.
         03 EncabezadoDetalle.
           05 FILLER PIC X(7) VALUE "COD RES".
           05 FILLER PIC X(7) VALUE spaces.
           05 FILLER PIC X(7) VALUE "FEC-DES".
           05 FILLER PIC X(7) VALUE spaces.
           05 FILLER PIC X(7) VALUE "FEC-HAS".
           05 FILLER PIC X(14) VALUE spaces.
           05 FILLER PIC X(5) VALUE "CATEG".
           05 FILLER PIC X(7) VALUE spaces.
           05 FILLER PIC X(7) VALUE "IMPORTE".
           05 FILLER PIC X(25) VALUE spaces.
           05 FILLER PIC X(9) VALUE "NOMB CLIE".
         03 Detalle.
           05 FILLER PIC X(1) VALUE spaces.
           05 CodigoReserva PIC ZZZZZ9.
           05 FILLER PIC X(7) VALUE spaces.
           05 Fec-Des PIC X(10).
           05 FILLER PIC X(4) VALUE spaces.
           05 Fec-Has PIC X(10).
           05 FILLER PIC X(2) VALUE spaces.
           05 Categoria PIC X(15).
           05 FILLER PIC X(4) VALUE spaces.
           05 Importe PIC $ZZZ.ZZ9,99.
           05 FILLER PIC X(23) VALUE spaces.
           05 NombreCliente PIC X(30).
         03 ReporteReservas.
           05 FILLER PIC X(22) VALUE "Cantidad de reservas: ".
           05 Cantidad PIC ZZZZ9.
         03 ReporteImporte.
           05 FILLER PIC X(15) VALUE "Importe Total: ".
           05 Total PIC $ZZZ.ZZ9,99.           
          
      ******************************************************************
       PROCEDURE DIVISION.
      ******************************************************************
       Begin.
         PERFORM InicializarFecha.
         PERFORM ArmarTablaCategoria.
         PERFORM ProcesarMaestro.
         STOP RUN.

      *********************************
       ArmarTablaCategoria.
         OPEN INPUT ArchivoCategorias.
         IF FSCategorias <> 0 AND FSCategorias <> 10
            MOVE "No se pudo abrir Categorias" TO MensajeError
            PERFORM FallaPrograma
         END-IF.
         
         PERFORM LeerCategoria.
         MOVE 1 TO ContadorCategoria.
         PERFORM UNTIL EofCategorias = 'S'
           MOVE RegistroCategorias 
            TO RegistroTablaCategoria(ContadorCategoria)
           ADD 1 TO ContadorCategoria
      * TODO: controlar si es 50 o 51
           IF ContadorCategoria > 50
             CLOSE ArchivoCategorias
             MOVE "Espacio insuficiente para categorias" TO MensajeError
             PERFORM FallaPrograma
           END-IF
           PERFORM LeerCategoria
         END-PERFORM.
         CLOSE ArchivoCategorias.

      *********************************
       MostrarTablaCategoria.
         MOVE 1 TO IndiceCategoria.
         PERFORM UNTIL IndiceCategoria = ContadorCategoria
           DISPLAY RegistroTablaCategoria(IndiceCategoria)
           ADD 1 TO IndiceCategoria
         END-PERFORM.

      *********************************       
       BuscarDescripcionCategoria.
         MOVE 1 TO IndiceCategoria.
         PERFORM UNTIL IndiceCategoria = ContadorCategoria 
            OR CAT-CATEG-HB OF RegistroTablaCategoria(IndiceCategoria) 
            EQUAL CategoriaBuscada
           ADD 1 TO IndiceCategoria
         END-PERFORM.
         IF CAT-CATEG-HB OF RegistroTablaCategoria(IndiceCategoria)
          not equal CategoriaBuscada
           PERFORM CerrarArchivos
      * TODO: Estaria bueno poner el codigo
           MOVE "Categoria inexistente" TO MensajeError
           PERFORM FallaPrograma.

      *********************************
       ProcesarMaestro.
         PERFORM AbrirArchivos.
         PERFORM LeerReservas.
         PERFORM ImprimirEncabezado.
         PERFORM CombinarEstadias     UNTIL   EofReservas1 = 'S'     AND 
                                              EofReservas2 = 'S'     AND 
                                              EofReservas3 = 'S'     AND 
                                              EofEstadias  = 'S'.
         PERFORM ImprimirTotales.
         PERFORM CerrarArchivos. 
      
      *********************************
       AbrirArchivos.
         OPEN INPUT ArchivoReservas1.
         IF FSReservas1 <> 0 AND FSReservas1 <> 10
            MOVE "No se pudo abrir Reservas1" TO MensajeError
            PERFORM FallaPrograma
         END-IF.
         OPEN INPUT ArchivoReservas2.
         IF FSReservas2 <> 0 AND FSReservas2 <> 10
            MOVE "No se pudo abrir Reservas2" TO MensajeError
            PERFORM FallaPrograma
         END-IF.
         OPEN INPUT ArchivoReservas3.
         IF FSReservas3 <> 0 AND FSReservas3 <> 10
            MOVE "No se pudo abrir Reservas3" TO MensajeError
            PERFORM FallaPrograma
         END-IF.
         OPEN INPUT ArchivoEstadias.
         IF FSEstadias <> 0 AND FSEstadias <> 10
            MOVE "No se pudo abrir Estadias" TO MensajeError
            PERFORM FallaPrograma
         END-IF.
         OPEN OUTPUT ArchivoMaestro.
         IF FSMaestro <> 0 AND FSMaestro <> 10
            MOVE "No se pudo abrir Maestro" TO MensajeError
            PERFORM FallaPrograma
         END-IF.
         OPEN OUTPUT ArchivoReporte.
 
      *********************************
       CombinarEstadias.
         PERFORM DeterminarMenor.
         MOVE 0 TO MAE-IMPORTE.
         MOVE 'N' TO MAE-ESTADO.

      *         MOVE "MENOR" TO MensajeDebug.
      *         PERFORM Debug.
       
      *         MOVE Menor TO MensajeDebug.
      *         PERFORM Debug.

         PERFORM ProcesarReserva1 UNTIL Menor NOT EQUAL RES1-COD-RES  OR
                      EofReservas1 = 'S'.

         PERFORM ProcesarReserva2 UNTIL Menor NOT EQUAL RES2-COD-RES  OR 
                                                     EofReservas2 = 'S'.

         PERFORM ProcesarReserva3 UNTIL Menor NOT EQUAL RES3-COD-RES  OR 
                                                     EofReservas3 = 'S'.
         MOVE Menor TO MAE-COD-RES.
         IF   Menor  =  EST-COD-RES    PERFORM   ProcesarEstadia   UNTIL 
                     Menor NOT EQUAL EST-COD-RES OR EofEstadias = 'S'.

         PERFORM GrabarMaestro.
      
         IF MAE-ESTADO = 'N' PERFORM ImprimirRegistro.

      *********************************
       DeterminarMenor.
         MOVE EST-COD-RES TO Menor.
      *  MOVE "MENOR ESTADIAS" TO MensajeDebug.
      *   PERFORM Debug.
      *  MOVE EST-COD-RES TO MensajeDebug.
      *         PERFORM Debug.
      *  MOVE "MENOR RES1" TO MensajeDebug.
      *        PERFORM Debug.
      *  MOVE RES1-COD-RES TO MensajeDebug.
      *        PERFORM Debug.
      *  MOVE "MENOR RES2" TO MensajeDebug.
      *        PERFORM Debug.
      *  MOVE RES2-COD-RES TO MensajeDebug.
      *        PERFORM Debug.
      *  MOVE "MENOR RES3" TO MensajeDebug.
      *        PERFORM Debug.
      *  MOVE RES3-COD-RES TO MensajeDebug.
      *        PERFORM Debug.

         IF RES1-COD-RES < Menor MOVE RES1-COD-RES TO Menor.
         IF RES2-COD-RES < Menor MOVE RES2-COD-RES TO Menor.
         IF RES3-COD-RES < Menor MOVE RES3-COD-RES TO Menor.

      *********************************
       ProcesarReserva1.
         MOVE RES1-RECURSO TO MAE-RECURSO.
         MOVE RES1-PERSONA TO MAE-PERSONA.
         ADD  RES1-IMP-RES TO MAE-IMPORTE.
         PERFORM LeerReserva1.
         IF EofReservas1 = 'S' MOVE 999999 TO RES1-COD-RES.

      *********************************
       ProcesarReserva2.
         MOVE RES2-RECURSO TO MAE-RECURSO.
         MOVE RES2-PERSONA TO MAE-PERSONA.
         ADD  RES2-IMP-RES TO MAE-IMPORTE.
         PERFORM LeerReserva2.
         IF EofReservas2 = 'S' MOVE 999999 TO RES2-COD-RES.

      *********************************
       ProcesarReserva3.
         MOVE RES3-RECURSO TO MAE-RECURSO.
         MOVE RES3-PERSONA TO MAE-PERSONA.
         ADD  RES3-IMP-RES TO MAE-IMPORTE.
         PERFORM LeerReserva3.
        IF EofReservas3 = 'S' MOVE 999999 TO RES3-COD-RES.

      *********************************
       ProcesarEstadia.
         MOVE Menor TO MAE-COD-RES.
         MOVE FECHA-DES OF EST-RECURSO TO FECHA-DES OF MAE-RECURSO.
         MOVE FECHA-HAS OF EST-RECURSO TO FECHA-HAS OF MAE-RECURSO.
         MOVE CATEG-HAB OF EST-RECURSO TO CATEG-HAB OF MAE-RECURSO.
         ADD  EST-IMPORTE TO MAE-IMPORTE.
      * TODO: evaluar cuando va 'S' y cuando 'N'
         MOVE 'A' TO MAE-ESTADO.
         PERFORM LeerEstadia.
         IF EofEstadias = 'S' MOVE 999999 TO Menor.

      *********************************
       GrabarMaestro.
        WRITE RegistroMaestro.
      

      *********************************      
       ImprimirRegistro.
         PERFORM ImprimirDetalleReserva.
      *   LSRES <- Descripcion.
      *   restot <- maemp.
          ADD MAE-IMPORTE TO TotalReservas.  	  
          ADD 1 TO CantidadReservas.
          ADD 1 to CantidadLineas.
          IF CantidadLineas EQUAL LineasPorPagina
             MOVE 0 TO CantidadLineas
             ADD 1 TO HojaNumero
             PERFORM ImprimirEncabezado
           END-IF.

      *********************************
       CerrarArchivos.
         CLOSE ArchivoReservas1.
         CLOSE ArchivoReservas2.
         CLOSE ArchivoReservas3.
         CLOSE ArchivoEstadias.
         CLOSE ArchivoMaestro.
         CLOSE ArchivoReporte.
      *********************************

       LeerReservas.
         PERFORM LeerReserva1.
         PERFORM LeerReserva2.
         PERFORM LeerReserva3.
         PERFORM LeerEstadia.

      *********************************
       ImprimirEncabezado.
         DISPLAY Encabezado OF ReporteSalida.
         MOVE Encabezado TO LINEA-REPORTE.
         PERFORM EscribirReporte.
         DISPLAY Titulo OF ReporteSalida.
         MOVE Titulo TO LINEA-REPORTE.
         PERFORM EscribirReporte.
         DISPLAY EncabezadoDetalle OF ReporteSalida.
         MOVE EncabezadoDetalle TO LINEA-REPORTE.
         PERFORM EscribirReporte.
      
      *********************************
       ImprimirDetalleReserva.
         MOVE MAE-COD-RES TO CodigoReserva OF Detalle.
         MOVE FECHA-DES OF MAE-RECURSO TO Fec-Des OF Detalle.
         MOVE FECHA-HAS OF MAE-RECURSO TO Fec-Has OF Detalle.
         MOVE CATEG-HAB OF MAE-RECURSO TO CategoriaBuscada.
         PERFORM BuscarDescripcionCategoria.
         MOVE CAT-DESCRIP OF RegistroTablaCategoria(IndiceCategoria) 
           TO Categoria OF Detalle.
         MOVE MAE-IMPORTE TO Importe OF Detalle.
         MOVE NOMBRE-CLI OF MAE-PERSONA TO NombreCliente OF Detalle.
         DISPLAY Detalle.
         MOVE Detalle TO LINEA-REPORTE.
         PERFORM EscribirReporte.

      *********************************
       ImprimirTotales.
         MOVE CantidadReservas TO Cantidad OF ReporteReservas.
         MOVE TotalReservas TO Total OF ReporteImporte.
         DISPLAY ReporteReservas.
         MOVE ReporteReservas TO LINEA-REPORTE.
         PERFORM EscribirReporte.
         DISPLAY ReporteImporte.
         MOVE ReporteImporte TO LINEA-REPORTE.
         PERFORM EscribirReporte.

      *********************************
       EscribirReporte.
         WRITE RegistroReporte.
         IF FSReporte not = 00
            DISPLAY "Error en escritura REPORTE."
         END-IF.
         MOVE "" to LINEA-REPORTE.


      *********************************
       LeerReserva1.
         READ ArchivoReservas1 AT END SET EofReservas1 TO 'S'.
         IF FSReservas1 <> 0 AND FSReservas1 <> 10
            MOVE "No se pudo leer Reservas1" TO MensajeError
            PERFORM FallaPrograma
         END-IF.

      *********************************
       LeerReserva2.
         READ ArchivoReservas2 AT END SET EofReservas2 TO 'S'.
         IF FSReservas2 <> 0 AND FSReservas2 <> 10
            MOVE "No se pudo leer Reservas2" TO MensajeError
            PERFORM FallaPrograma
         END-IF.

      *********************************
       LeerReserva3.
         READ ArchivoReservas3 AT END SET EofReservas3 TO 'S'.
         IF FSReservas3 <> 0 AND FSReservas3 <> 10
            MOVE "No se pudo leer Reservas3" TO MensajeError
            PERFORM FallaPrograma
         END-IF.

      *********************************
       LeerEstadia.
         READ ArchivoEstadias AT END SET EofEstadias TO 'S'.
         IF FSEstadias <> 0 AND FSEstadias <> 10
            MOVE "No se pudo leer Estadias" TO MensajeError
            PERFORM FallaPrograma
         END-IF.

      *********************************
       LeerCategoria.
         READ ArchivoCategorias AT END SET EofCategorias TO 'S'.
         IF FSCategorias <> 0 AND FSCategorias <> 10
            MOVE "No se pudo leer Categorias" TO MensajeError
            PERFORM FallaPrograma
         END-IF.

      *********************************      
       InicializarFecha.
         ACCEPT Fecha FROM DATE.
         MOVE Anio OF Fecha TO Anio OF FechaReporte.
         MOVE Mes OF Fecha TO Mes OF FechaReporte.
         MOVE Dia OF Fecha TO Dia OF FechaReporte.

      *********************************
       FallaPrograma.
         DISPLAY LineaError.
         STOP RUN.


      *********************************
       Debug.
         IF MostrarDebug EQUAL 'S'
           DISPLAY LineaDebug.
